package com.seek.oss.service.impl;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.seek.oss.service.OssService;
import com.seek.oss.utils.ConstantPropertiesUtil;
import org.apache.commons.lang3.StringUtils;
import org.joda.time.DateTime;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;
import java.util.UUID;

/**
 * author wml
 * Created on 2022/1/13 12:20
 */
@Service
public class OssServiceImpl implements OssService {

    // 上传头像到 oss 的方法
    @Override
    public String uploadFileAvatar(MultipartFile file) {
        String endpoint = ConstantPropertiesUtil.ENDPOINT;
        String accessKeyId = ConstantPropertiesUtil.KEY_ID;
        String accessKeySecret = ConstantPropertiesUtil.KEY_SECRET;
        String bucketName = ConstantPropertiesUtil.BUCKET_NAME;

        // 创建 OSS 实例
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        // 上传文件的命名规则
        // 给上传文件进行重新命名
        // 获取原文件名
        String fileOriginalName = file.getOriginalFilename();
        // 通过原文件名 abc.jpg 获取文件的后缀
        String fileSuffix = StringUtils.substringAfterLast(fileOriginalName, ".");
        // UUID 生成新的文件名（防止重复）
        String newFileName = UUID.randomUUID().toString() + "." +  fileSuffix;
        // 把文件按照日期进行分类
        String datePath = new DateTime().toString("yyyy-MM");
        String pathAndName = datePath + "/" + newFileName;
        try {
            // 获取上传文件输入流
            InputStream inputStream = file.getInputStream();
            // 调用 oss 方法实现上传（参数1：bucket名称， 参数2：上传到oss文件路径和文件名称，参数3：上传文件输入流）
            ossClient.putObject(bucketName, pathAndName, inputStream);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            ossClient.shutdown();
        }
        String url = "https://" + bucketName + "." + endpoint + "/" + pathAndName;
        return url;
    }
}
